package com.ruoyi.system.service.impl;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.GuangDianUser;
import com.ruoyi.system.mapper.GuangDianUserMapper;

/**
 * 广电用户数据定时任务
 * 每5分钟从CSV文件抽取100条数据到数据库
 */
@Component
public class GuangDianUserTask {
    
    private static final Logger logger = LoggerFactory.getLogger(GuangDianUserTask.class);
    
    @Autowired
    private GuangDianUserMapper guangDianUserMapper;
    
    // CSV文件路径配置
    @Value("${guangdian.csv.path:C:/Users/Administrator/RuoYi-Vue/guangdian-data-analysis/宽表数据.csv}")
    private String csvFilePath;
    
    // 当前读取的行号
    private final AtomicInteger currentLine = new AtomicInteger(0);
    
    // 批量插入的大小
    private static final int BATCH_SIZE = 100;
    
    /**
     * 初始化任务，记录启动日志
     */
    @PostConstruct
    public void init() {
        logger.info("广电用户数据定时任务初始化完成，CSV文件路径：{}", csvFilePath);
    }
    
    /**
     * 每5分钟执行一次数据抽取任务
     * cron表达式：0 0/5 * * * ? 表示每5分钟执行一次
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void extractDataFromCsv() {
        logger.info("开始执行广电用户数据抽取任务，当前时间：{}", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        
        if (!Files.exists(Paths.get(csvFilePath))) {
            logger.error("CSV文件不存在：{}", csvFilePath);
            return;
        }
        
        List<GuangDianUser> userList = new ArrayList<>(BATCH_SIZE);
        int linesRead = 0;
        int skipLines = currentLine.get();
        
        try (BufferedReader reader = new BufferedReader(new FileReader(csvFilePath))) {
            String line;
            boolean isFirstLine = true; // 跳过标题行
            
            // 读取文件直到达到100条数据或文件结束
            while ((line = reader.readLine()) != null && linesRead < BATCH_SIZE) {
                // 跳过标题行
                if (isFirstLine) {
                    isFirstLine = false;
                    if (skipLines > 0) {
                        skipLines--;
                        currentLine.incrementAndGet();
                        continue;
                    }
                }
                
                // 如果需要跳过前面的行
                if (skipLines > 0) {
                    skipLines--;
                    currentLine.incrementAndGet();
                    continue;
                }
                
                // 解析CSV行
                GuangDianUser user = parseCsvLine(line);
                if (user != null) {
                    userList.add(user);
                    linesRead++;
                    currentLine.incrementAndGet();
                }
            }
            
            // 如果读取到数据，进行批量插入
            if (!userList.isEmpty()) {
                int inserted = guangDianUserMapper.batchInsert(userList);
                logger.info("成功插入 {} 条广电用户数据", inserted);
            } else {
                logger.info("未读取到新的数据或已读取到文件末尾");
                // 如果读取到文件末尾，重置行号
                if (line == null) {
                    currentLine.set(0);
                    logger.info("已读取到文件末尾，重置读取位置到文件开始");
                }
            }
            
        } catch (IOException e) {
            logger.error("读取CSV文件出错：{}", e.getMessage(), e);
        } catch (Exception e) {
            logger.error("处理广电用户数据出错：{}", e.getMessage(), e);
        }
        
        logger.info("广电用户数据抽取任务执行完成，读取行数：{}", linesRead);
    }
    
    /**
     * 解析CSV行数据为GuangDianUser对象
     * @param line CSV行数据
     * @return GuangDianUser对象
     */
    private GuangDianUser parseCsvLine(String line) {
        try {
            // 使用逗号分割CSV行
            String[] fields = line.split(",");
            
            // 检查字段数量是否足够
            if (fields.length < 15) {
                logger.warn("CSV行字段数量不足：{}", line);
                return null;
            }
            
            GuangDianUser user = new GuangDianUser();
            
            // 解析基本信息字段
            user.setTerminalNo(getFieldValue(fields, 0)); // 地址编号
            user.setPhoneNo(getFieldValue(fields, 1)); // 用户编号
            user.setSmName(getFieldValue(fields, 2)); // 品牌名称
            user.setSmCode(getFieldValue(fields, 3)); // 品牌编号
            user.setRunName(getFieldValue(fields, 4)); // 状态名称
            user.setOwnerName(getFieldValue(fields, 5)); // 用户等级名称
            user.setOwnerCode(getFieldValue(fields, 6)); // 用户等级编号
            user.setRunTime(getFieldValue(fields, 7)); // 状态变更时间
            user.setAddress(getFieldValue(fields, 8)); // 完整地址
            user.setEstateName(getFieldValue(fields, 9)); // 街道或小区地址
            user.setOpenTime(getFieldValue(fields, 10)); // 开户时间
            user.setForce(getFieldValue(fields, 11)); // 宽带是否生效
            
            // 解析标签字段
            user.setIsHeavyUser(getFieldValue(fields, 12)); // 是否重度用户
            user.setTvConsumptionLevel(getFieldValue(fields, 13)); // 电视消费水平
            user.setIsLoyalUser(getFieldValue(fields, 14)); // 是否忠诚用户
            
            // 设置第15、16、17个字段（如果存在）
            if (fields.length > 15) {
                user.setIsBroadbandUser(getFieldValue(fields, 15)); // 是否宽带用户
            }
            if (fields.length > 16) {
                user.setUserType(getFieldValue(fields, 16)); // 用户类型
            }
            if (fields.length > 17) {
                user.setIsElderlyPeople(getFieldValue(fields, 17)); // 是否老年人
            }
            if (fields.length > 18) {
                user.setIsHighValueUser(getFieldValue(fields, 18)); // 是否高价值用户
            }
            
            // 设置创建时间和更新时间
            user.setCreateTime(LocalDateTime.now());
            user.setUpdateTime(LocalDateTime.now());
            
            return user;
        } catch (Exception e) {
            logger.error("解析CSV行出错：{}, 错误信息：{}", line, e.getMessage());
            return null;
        }
    }
    
    /**
     * 安全获取数组字段值
     * @param fields 字段数组
     * @param index 索引
     * @return 字段值，去除前后空格
     */
    private String getFieldValue(String[] fields, int index) {
        if (index >= 0 && index < fields.length) {
            String value = fields[index].trim();
            // 去除可能的引号
            if (value.startsWith("\"") && value.endsWith("\"")) {
                value = value.substring(1, value.length() - 1);
            }
            return StringUtils.isNotEmpty(value) ? value : null;
        }
        return null;
    }
    
    /**
     * 手动触发数据抽取任务的方法（用于测试）
     */
    public void triggerExtractTask() {
        logger.info("手动触发广电用户数据抽取任务");
        extractDataFromCsv();
    }
}